#include "effectedit.h"
#include <QDebug>

effectedit::effectedit(QObject *parent)
    : QObject{parent}
{

}

effectedit::~effectedit()
{

}

//参数入参范围h(0~360),s(0~100),v(0~100)
QColor effectedit::hsv2rgb(int h,int s,int v)
{
    float C = 0,X = 0,Y = 0,Z = 0;
    float R,G,B;
    int i=0;
    float H=(float)(h);
    float S=(float)(s)/100.0;
    float V=(float)(v)/100.0;
    if(S == 0)
        R = G = B = V;
    else
    {
        H = H/60;
        i = (int)H;
        C = H - i;

        X = V * (1 - S);
        Y = V * (1 - S*C);
        Z = V * (1 - S*(1-C));
        switch(i){
            case 0 : R = V; G = Z; B = X; break;
            case 1 : R = Y; G = V; B = X; break;
            case 2 : R = X; G = V; B = Z; break;
            case 3 : R = X; G = Y; B = V; break;
            case 4 : R = Z; G = X; B = V; break;
            case 5 : R = V; G = X; B = Y; break;
        }
    }
    R = R * 255;
    G = G * 255;
    B = B * 255;
    return QColor(R,G,B);
}

/*  单色模式生成函数
    ledNum: 灯珠总数
    color: 填充的颜色
*/
QList<QColor> effectedit::oneColor(int ledNum, QColor color)
{
    QList<QColor> colorList;
    colorList.clear();

    colorList.fill(color, ledNum);

    return colorList;
}

// RWL = running water lamp
/*  一段流水生成函数
    ledNum: 灯珠总数
    rwLedNum: 要流水的灯珠数量
    rwDelayFrame: 流水的间隔帧数
    rwColor: 流水颜色
    backColor: 底色
*/
//QList<QColor> effectedit::sectionRWL(int ledNum, int rwLedNum, int rwDelayFrame, QColor rwColor, QColor backColor)
//{
//    QList<QColor> colorList;
//    QList<QColor> colorListOneFrame;
//    colorList.clear();
//    colorListOneFrame.clear();
//    int changeFrames = ledNum + rwLedNum - 1; // 有数据改变的帧数
//    int newColorIndex = 0;

//    colorListOneFrame.fill(backColor, ledNum);
//    for(int i = 0; i < changeFrames; i++) {
//        colorListOneFrame.replace(((i - rwLedNum) < 0) ? 0 : (i - rwLedNum), backColor); // 消除之前的颜色为背景色
//        for(int k = 0; k < rwLedNum; k++) {
//            newColorIndex = i - k;
//            if(newColorIndex < 0) newColorIndex = 0;
//            else if(newColorIndex >= ledNum) newColorIndex = ledNum - 1;
//            colorListOneFrame.replace(newColorIndex, rwColor); // 设置新的颜色
//        }
//        for(int j = 0; j < rwDelayFrame; j++) {
//            colorList += colorListOneFrame;
//        }
//    }
//    colorListOneFrame.fill(backColor, ledNum);
//    colorList += colorListOneFrame;

////    qDebug() << colorList;
//    return colorList;
//}
/*  多段流水生成函数
    ledNum: 灯珠总数
    rwLedNum: 要流水的灯珠数量
    rwSpacing: 每段间隔灯珠数量
    rwSections: 几段流水
    rwDelayFrame: 流水的保持帧数
    rwColor: 流水颜色
    backColor: 底色
*/
QList<QColor> effectedit::sectionsRWL(int ledNum, int rwLedNum, int rwSpacing, int rwSections, int rwDelayFrame, QColor rwColor, QColor backColor)
{
    QList<QColor> colorList;
    QList<QColor> colorListOneFrame;
    colorList.clear();
    colorListOneFrame.clear();
    int spacingLedNum = rwSpacing + rwLedNum;
    int changeFrames = ledNum + rwLedNum - 1 + (rwSections - 1) * spacingLedNum; // 有数据改变的帧数
    int newColorIndex = 0;
    int lastColorInedx = 0;

    colorListOneFrame.fill(backColor, ledNum);
    // 将所有要改变的帧进行处理
    for(int i = 0; i < changeFrames; i++) {
        // 根据分段数进行某一段灯珠的颜色渲染
        for(int l = 0; l < rwSections; l++) {
            lastColorInedx = i - rwLedNum - l * spacingLedNum;
            // 索引溢出则不处理
            if(lastColorInedx < 0) ;
            else if(lastColorInedx >= ledNum) ;
            else colorListOneFrame.replace(lastColorInedx, backColor); // 设置当前分段l的要消失的灯珠颜色为背景色
            // 根据流动灯珠数进行当前分段的灯珠的颜色渲染
            for(int k = 0; k < rwLedNum; k++) {
                newColorIndex = i - k - l * spacingLedNum;
                // 索引溢出则不处理
                if(newColorIndex < 0) ;
                else if(newColorIndex >= ledNum) ;
                else colorListOneFrame.replace(newColorIndex, rwColor); // 设置当前分段l的当前流动灯珠k的颜色为前景色
            }
        }
        // 根据保持帧数进行当前帧的重复
        for(int j = 0; j < rwDelayFrame; j++) {
            colorList += colorListOneFrame;
        }
    }
    // 添加一帧全为背景色的流水结束
    colorListOneFrame.fill(backColor, ledNum);
    colorList += colorListOneFrame;

//    qDebug() << colorList;
    return colorList;
}
